DOC: https://docs.mongodb.com/manu...
collection(test)结构
{
_id: Objectd("123456789"),
category: [
'apple_1',
'apple_2',
'banana_1',
'banana_2'
]
}
Question:
对test表的所有数据做category过滤,返回category中以apple开头的元素
表原数据:
[
{
_id: Objectd("id1"),
category: [
'apple_1',
'apple_2',
'banana_1',
'banana_2'
]
},
{
_id: Objectd("id2"),
category: [
'apple_3',
'apple_4',
'banana_1',
'banana_2'
]
}
...
]
返回数据示例:
[
{
_id: Objectd("id1"),
category: [
'apple_1',
'apple_2'
]
},
{
_id: Objectd("id2"),
category: [
'apple_3',
'apple_4'
]
}
...
]
数据库try:随机构建test表
function getRandomArrayElements(arr, count) {
var shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index;
while (i-- > min) {
index = Math.floor((i + 1) * Math.random());
temp = shuffled[index];
shuffled[index] = shuffled[i];
shuffled[i] = temp;
}
return shuffled.slice(min);
}
var temp = ['apple_1','apple_2','banana_3','banana_4','pear_5','pear_6','pear_7'];
for(var i =0; i < 10; i ++){
db.getCollection("test").insert({
category:getRandomArrayElements(temp, Math.random()*7)
})
}
Try 1:
db.test.find({},{'category':{
'$elemMatch':{
$regex: 'apple'
}
}})
返回:
[
{
_id: Objectd("id1"),
category: [
'apple_1',
]
},
{
_id: Objectd("id2"),
category: [
'apple_3',
]
}
...
]
category只保留了符合过滤规则的第一个元素
Try 2:
db.test.aggregate(
{
$unwind: '$category'
},
{
$match: {
category: {
$regex: 'apple_'
}
}
},
//unwind,match顺序不能换
)
返回:
[
{
_id: Objectd("id1"),
category: 'apple_1'
},
{
_id: Objectd("id1"),
category: 'apple_2'
},
{
_id: Objectd("id2"),
category: 'apple_3'
},
{
_id: Objectd("id2"),
category: 'apple_4'
}
...
]
将一个文档拆分成多个文档返回
Try 3(Solution):
db.test.aggregate({
$project: {
"category":{
$filter: {
input: "$category",
as: "cate",
cond: {
// category数组元素cate包含字符串'apple_'
$eq: [ {
$indexOfCP: ["$$cate", "apple_"]
}, 0]
}
}
}
}
})
返回:
[
{
_id: Objectd("id1"),
category: [
'apple_1',
'apple_2'
]
},
{
_id: Objectd("id2"),
category: [
'apple_3',
'apple_4'
]
}
...
]
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。